﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI.WebControls;
using vudu.ClasesDominio;
using vudu.Logica.Fachada;
using vudu.Presentacion.Contrato.VU_08_Gestionar_Notas_de_Estudiantes;

namespace vudu.Presentacion.Presentador.VU_08_Gestionar_Notas_de_Estudiantes
{
    /// <summary>
    /// Clase que hace de presentador para la vistat gestionar nota
    /// </summary>
    public class PresentadorGestionarNotas
    {
        #region Atributos

        private IContratoGestionarNotas _vista;

        private EnlaceLogico _logica;
        private List<Estudiante> _estudiantes;
        private string _rol;
        private int _idUsuario;
        private string _nombreUsuario;
        private Estudiante _estudiante;

        #endregion

        #region Constructor
        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="vista"></param>
        public PresentadorGestionarNotas(IContratoGestionarNotas vista)
        {
            _vista = vista;
            _logica = new EnlaceLogico();
            _rol = (string)_vista.Sesion["TipoRol"];

            if (_rol != null)
            {
                if (_rol.Equals("Escuela"))
                {
                    EnlaceLogico fachada = (EnlaceLogico)_vista.Sesion["Fachada"];
                    Escuela escuela = (Escuela)fachada.RolActual;
                    _idUsuario = escuela.IdEscuela;
                    _nombreUsuario = escuela.NombreEscuela;
                }
                else if (_rol.Equals("Estudiante"))
                {
                    EnlaceLogico fachada = (EnlaceLogico)_vista.Sesion["Fachada"];
                    _estudiante = (Estudiante)fachada.RolActual;
                    _idUsuario = _estudiante.IdEst;
                    _nombreUsuario = _estudiante.Nombre + " " + _estudiante.Apellido;
                }
                else if (_rol.Equals("Profesor"))
                {
                    EnlaceLogico fachada = (EnlaceLogico)_vista.Sesion["Fachada"];
                    Profesor profesor = (Profesor)fachada.RolActual;
                    _idUsuario = profesor.Cedula;
                    _nombreUsuario = profesor.Nombre + " " + profesor.Apellido;
                }

            }
    
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Metodo que realiza las acciones cuando se carga la vista
        /// </summary>
        public void CargarPagina()
        {
            _vista.MensajeError.Visible = false;
            _vista.MensajeFinal.Visible = false;
            _vista.PanelListaNotas.Visible = false;
            _vista.InformacionUsuario.Text = _rol + ": " + _nombreUsuario;
            _vista.Materias.Items.Clear();
            List<SeccionMateria> listaMaestra = null;
            ListItem item = new ListItem("Seleccione", "-1");
            _vista.Materias.Items.Add(item);
            if(_rol!= null)
            {
                if (_rol.Equals("Escuela"))
                {
                    Escuela escuela = new Escuela();
                    escuela.IdEscuela = _idUsuario;
                    listaMaestra = _logica.ConsultarMateriaEscuelaPeriodo(escuela);
                }
                if (_rol.Equals("Estudiante"))
                {
                    Estudiante estudiante = new Estudiante();
                    estudiante.IdEst = _idUsuario;
                    listaMaestra = _logica.ConsultarMateriaEstudiantePeriodo(estudiante);
                }
                if (_rol.Equals("Profesor"))
                {
                    Profesor profesor = new Profesor();
                    profesor.Cedula = _idUsuario;
                    listaMaestra = _logica.ConsultarMateriaProfesorPeriodo(profesor);
                }

                List<Materia> lista = new List<Materia>();
                _vista.Sesion["listaMaestra"] = listaMaestra;

                foreach (SeccionMateria seccionMateria in listaMaestra)
                    if (!ExisteEnLista(seccionMateria.Materia, lista))
                        lista.Add(seccionMateria.Materia);

                _vista.Sesion["listaMateria"] = lista;

                foreach (Materia materia in lista)
                {
                    item = new ListItem(materia.Nombre, materia.Codigo.ToString());
                    _vista.Materias.Items.Add(item);
                }
            }
            

        }

        /// <summary>
        /// Metodo que carga todas las secciones correspondiente la materia 
        /// </summary>
        public void CargarSecciones()
        {


            _vista.MensajeError.Visible = false;
            _vista.MensajeFinal.Visible = false;

            if(MateriaSeleccionada().Codigo != -1)
            {
                _vista.PanelListaNotas.Visible = false;
                _vista.Secciones.Items.Clear();
                ListItem item = new ListItem("Seleccione", "-1");
                _vista.Secciones.Items.Add(item);
                foreach (SeccionMateria seccion in SeleccionarSeccionMateria(MateriaSeleccionada()))
                {
                    item = new ListItem(seccion.Codigo.ToString(), seccion.IdSeccionMateria.ToString());
                    _vista.Secciones.Items.Add(item);
                }

                _vista.PanelListaNotas.Visible = false;
                _vista.MensajeFinal.Visible = false;
                _vista.MensajeError.Visible = false;
            }
            else
            {
                _vista.MensajeError.Visible = true;
                _vista.MensajeError.InnerText = "Debe Selecionar una Materia";
            }



        }

        /// <summary>
        /// Metodo que carga todas las secciones correspondientes a la materia
        /// </summary>
        public void CargarEvaluaciones()
        {


            _vista.MensajeError.Visible = false;
            _vista.MensajeFinal.Visible = false;
            if(SeccionSeleccionada().IdSeccionMateria != -1)
            {
                _vista.Evaluaciones.Items.Clear();

                ListItem item = new ListItem("Seleccione", "-1");
                _vista.Evaluaciones.Items.Add(item);
                foreach (Evaluacion evaluacion in _logica.ConsultarEsquemaEvaluacionSeccion(SeccionSeleccionada()))
                {
                    item = new ListItem(evaluacion.Nombre, evaluacion.IdEvaluacion.ToString());
                    _vista.Evaluaciones.Items.Add(item);
                }
                if (_rol.Equals("Profesor"))
                {
                    item = new ListItem("Agregar Nuevo Esquema", "-2");
                    _vista.Evaluaciones.Items.Add(item);
                }
                if (_rol.Equals("Estudiante"))
                {
                    _estudiantes = new List<Estudiante>();
                    _estudiantes.Add(_estudiante);
                }
                else
                    _estudiantes = _logica.ConsultarEstudiantesSeccion(SeccionSeleccionada());

                _vista.Sesion["listaEstudiantes"] = _estudiantes;   
            }
            else
            {

                _vista.MensajeError.Visible = true;
                _vista.MensajeError.InnerText = "Debe Selecionar una Seccion";   
            }
            
        }

        /// <summary>
        /// Metodo que carga todas las notas 
        /// </summary>
        public void CargarNotas()
        {


            _vista.MensajeError.Visible = false;
            _vista.MensajeFinal.Visible = false;
            if((MateriaSeleccionada().Codigo != -1)&&(SeccionSeleccionada().IdSeccionMateria != -1)&&(EvaluacionSeleccionada().IdEvaluacion != -1))
            {

                if (_estudiantes == null)
                    _estudiantes = (List<Estudiante>)_vista.Sesion["listaEstudiantes"];

                DataTable table = new DataTable();
                table.Columns.Add("Cedula", typeof(int));
                table.Columns.Add("Nombre", typeof(string));
                table.Columns.Add("Correo", typeof(string));
                table.Columns.Add("Telefono", typeof(string));
                table.Columns.Add("Nota", typeof(string));
                foreach (Estudiante estudiante in _estudiantes)
                {
                    Nota nota = _logica.ConsultarNotaEstudianteEvaluacion(EvaluacionSeleccionada().IdEvaluacion, estudiante.IdEst);
                    // No se ha cargado la nota inicialmente
                    if (nota == null)
                    {
                        nota = new Nota();
                        nota.Estudiante = estudiante;
                        nota.Evaluacion = EvaluacionSeleccionada();
                        nota.Materia = MateriaSeleccionada();
                        nota.NotaObtenida = 0;
                        _logica.IngresarNota(nota);
                        nota.NotaObtenida = nota.NotaObtenida;
                    }
                    else
                        nota.NotaObtenida = nota.NotaObtenida;

                    table.Rows.Add(estudiante.Cedula, estudiante.Nombre + " " + estudiante.Apellido, estudiante.Correo,
                                      estudiante.Telefono, nota.NotaObtenida.ToString());
                }

                _vista.Notas.DataSource = table;
                _vista.Notas.DataBind();
                bool visibilidad = !_rol.Equals("Profesor");
                for (int i = 0; i < _vista.Notas.Rows.Count; i++)
                {
                    ((TextBox)_vista.Notas.Rows[i].FindControl("nota")).ReadOnly = visibilidad;
                }
                _vista.PanelListaNotas.Visible = true;   
            }
            else
            {

                _vista.MensajeError.Visible = true;
                _vista.MensajeError.InnerText = "Debe Selecionar los atributos";
            }
            
        }

        public void SeleccionarEvaluacion()
        {
            if (_vista.Evaluaciones.SelectedValue.Equals("-2"))
                _vista.Redireccionar(
                    "/Presentacion/Vista/VU_07 Gestionar Esquema de Evaluacion por Profesor/AgregarEsquema.aspx");
        }

        /// <summary>
        /// Metodo que guarda los cambios efectuados
        /// </summary>
        public void Guardar()
        {

            if (_estudiantes == null)
                _estudiantes = (List<Estudiante>)_vista.Sesion["listaEstudiantes"];

            for (int i = 0; i < _vista.Notas.Rows.Count; i++ )
            {
                Nota nota = _logica.ConsultarNotaEstudianteEvaluacion(EvaluacionSeleccionada().IdEvaluacion, _estudiantes[i].IdEst);
                nota.NotaObtenida = Convert.ToInt32(((TextBox)_vista.Notas.Rows[i].FindControl("nota")).Text);
                _logica.EditarNota(nota);
            }
            _vista.MensajeFinal.Visible = true;
        }

        /// <summary>
        /// Metodo que arma un objeto de materia con los datos que el usuario selecciono en el combo
        /// </summary>
        /// <returns></returns>
        private Materia MateriaSeleccionada()
        {

            Materia materia = new Materia();
            materia.Codigo = Convert.ToInt32(_vista.Materias.SelectedItem.Value);
            materia.Nombre = _vista.Materias.SelectedItem.Text;
            return materia;
        }

        /// <summary>
        /// Metodo que arma un objeto de materia con los datos que el usuario selecciono en el combo
        /// </summary>
        /// <returns></returns>
        private SeccionMateria SeccionSeleccionada()
        {

            SeccionMateria seccion = new SeccionMateria();
            try
            {

                seccion.IdSeccionMateria = Convert.ToInt32(_vista.Secciones.SelectedItem.Value);
                seccion.Codigo = Convert.ToInt32(_vista.Secciones.SelectedItem.Text);
            }
            catch (Exception)
            {

                seccion.IdSeccionMateria = -1;
                seccion.Codigo = -1;
            }
            return seccion;
        }

        /// <summary>
        /// Metodo que arma un objeto de materia con los datos que el usuario selecciono en el combo
        /// </summary>
        /// <returns></returns>
        private Evaluacion EvaluacionSeleccionada()
        {
            Evaluacion evaluacion = new Evaluacion();
            evaluacion.IdEvaluacion = Convert.ToInt32(_vista.Evaluaciones.SelectedItem.Value);
            evaluacion.Nombre = _vista.Evaluaciones.SelectedItem.Text;
            return evaluacion;
        }
        
        /// <summary>
        /// Metodo que verifica si una materia ya existe dentro de la lista de materias global
        /// </summary>
        /// <param name="materia"></param>
        /// <param name="lista"></param>
        /// <returns></returns>
        private bool ExisteEnLista(Materia materia, List<Materia> lista )
        {
            foreach (Materia seccionMateria in lista)
            {
                if (materia.Codigo == seccionMateria.Codigo)
                    return true;
            }
            return false;
        }

        /// <summary>
        /// Metodo que selecciona la secciones de una materia dado esta
        /// </summary>
        /// <param name="materia"></param>
        /// <returns></returns>
        private List<SeccionMateria> SeleccionarSeccionMateria(Materia materia)
        {
            List<SeccionMateria> lista = (List<SeccionMateria>) _vista.Sesion["listaMaestra"];
            List<SeccionMateria> retorno = new List<SeccionMateria>();
            foreach (SeccionMateria seccionMateria in lista)
            {
                if(seccionMateria.Materia.Codigo == materia.Codigo)
                    retorno.Add(seccionMateria);
            }

            return retorno;
        } 

        #endregion
    }
}